package org.example.rzfx.config;

import cn.dev33.satoken.stp.StpInterface;
import org.example.rzfx.entity.User;
import org.example.rzfx.mapper.UserMapper;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * Sa-Token权限认证接口实现
 * 用于获取用户的角色和权限列表
 */
@Component
public class StpInterfaceImpl implements StpInterface {
    
    @Resource
    private UserMapper userMapper;
    
    /**
     * 返回指定账号id所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        List<String> permissions = new ArrayList<>();
        
        // 根据用户ID查询权限
        Long userId = Long.parseLong(loginId.toString());
        User user = userMapper.selectById(userId);
        
        if (user != null) {
            // 管理员拥有所有权限
            if (user.getRole() == 1) {
                permissions.add("*");  // 所有权限
                permissions.add("user.create");
                permissions.add("user.update");
                permissions.add("user.delete");
                permissions.add("system.config");
                permissions.add("log.delete");
            } else {
                // 运维人员基础权限
                permissions.add("log.query");
                permissions.add("log.export");
                permissions.add("alarm.handle");
            }
        }
        
        return permissions;
    }
    
    /**
     * 返回指定账号id所拥有的角色标识集合
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        List<String> roles = new ArrayList<>();
        
        // 根据用户ID查询角色
        Long userId = Long.parseLong(loginId.toString());
        User user = userMapper.selectById(userId);
        
        if (user != null) {
            // 将数字角色转为字符串
            roles.add(String.valueOf(user.getRole()));
            
            // 添加角色名称
            if (user.getRole() == 1) {
                roles.add("admin");
            } else if (user.getRole() == 2) {
                roles.add("operator");
            }
        }
        
        return roles;
    }
}

